package com.ak.game.service;

import com.ak.game.entity.PnGame;
import com.ak.game.util.AjaxResult;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Random;

@Service
public class BettingService {

    /**
     * 赔率
     */
    public static Map<String, BigDecimal[]> ODDS = new HashMap<>();

    /**
     * 杀率
     */
    public static Double winRate;

    /**
     * 试玩胜率
     */
    public static Integer tryOutRate;

    private final Random random = new Random();

    public static Map<String, ChannelHandlerContext> USER_CTX_MAP = new LinkedHashMap<>();

    public static Map<String, Boolean> USER_IS_TRY_OUT = new HashMap<>();

    @Autowired
    private PnGameService gameService;

    @PostConstruct
    private void initOdds() {
        ODDS.clear();
        PnGame pnGame = gameService.getPnGame();
        String config = pnGame.getConfig();
        JSONObject jsonObject = JSONObject.parseObject(config);
        ODDS.put("1", new BigDecimal[]{jsonObject.getList("1", BigDecimal.class).get(0), jsonObject.getList("1", BigDecimal.class).get(1)});
        ODDS.put("2", new BigDecimal[]{jsonObject.getList("2", BigDecimal.class).get(0), jsonObject.getList("2", BigDecimal.class).get(1)});
        ODDS.put("3", new BigDecimal[]{jsonObject.getList("3", BigDecimal.class).get(0), jsonObject.getList("3", BigDecimal.class).get(1)});
        ODDS.put("4", new BigDecimal[]{jsonObject.getList("4", BigDecimal.class).get(0), jsonObject.getList("4", BigDecimal.class).get(1)});
        ODDS.put("5", new BigDecimal[]{jsonObject.getList("5", BigDecimal.class).get(0), jsonObject.getList("5", BigDecimal.class).get(1)});
        ODDS.put("6", new BigDecimal[]{jsonObject.getList("6", BigDecimal.class).get(0), jsonObject.getList("6", BigDecimal.class).get(1)});
        ODDS.put("7", new BigDecimal[]{jsonObject.getList("7", BigDecimal.class).get(0), jsonObject.getList("7", BigDecimal.class).get(1)});
        ODDS.put("8", new BigDecimal[]{jsonObject.getList("8", BigDecimal.class).get(0), jsonObject.getList("8", BigDecimal.class).get(1)});
        ODDS.put("9", new BigDecimal[]{jsonObject.getList("9", BigDecimal.class).get(0), jsonObject.getList("9", BigDecimal.class).get(1)});
        ODDS.put("10", new BigDecimal[]{jsonObject.getList("10", BigDecimal.class).get(0), jsonObject.getList("10", BigDecimal.class).get(1)});
        ODDS.put("11", new BigDecimal[]{jsonObject.getList("11", BigDecimal.class).get(0), jsonObject.getList("11", BigDecimal.class).get(1)});
        ODDS.put("12", new BigDecimal[]{jsonObject.getList("12", BigDecimal.class).get(0), jsonObject.getList("12", BigDecimal.class).get(1)});
        ODDS.put("13", new BigDecimal[]{jsonObject.getList("13", BigDecimal.class).get(0), jsonObject.getList("13", BigDecimal.class).get(1)});
        ODDS.put("14", new BigDecimal[]{jsonObject.getList("14", BigDecimal.class).get(0), jsonObject.getList("14", BigDecimal.class).get(1)});
        ODDS.put("15", new BigDecimal[]{jsonObject.getList("15", BigDecimal.class).get(0), jsonObject.getList("15", BigDecimal.class).get(1)});
        ODDS.put("16", new BigDecimal[]{jsonObject.getList("16", BigDecimal.class).get(0), jsonObject.getList("16", BigDecimal.class).get(1)});
        ODDS.put("17", new BigDecimal[]{jsonObject.getList("17", BigDecimal.class).get(0), jsonObject.getList("17", BigDecimal.class).get(1)});
        ODDS.put("18", new BigDecimal[]{jsonObject.getList("18", BigDecimal.class).get(0), jsonObject.getList("18", BigDecimal.class).get(1)});
        ODDS.put("19", new BigDecimal[]{jsonObject.getList("19", BigDecimal.class).get(0), jsonObject.getList("19", BigDecimal.class).get(1)});
        ODDS.put("20", new BigDecimal[]{jsonObject.getList("20", BigDecimal.class).get(0), jsonObject.getList("20", BigDecimal.class).get(1)});
        ODDS.put("21", new BigDecimal[]{jsonObject.getList("21", BigDecimal.class).get(0), jsonObject.getList("21", BigDecimal.class).get(1)});
        ODDS.put("22", new BigDecimal[]{jsonObject.getList("22", BigDecimal.class).get(0), jsonObject.getList("22", BigDecimal.class).get(1)});
        ODDS.put("23", new BigDecimal[]{jsonObject.getList("23", BigDecimal.class).get(0), jsonObject.getList("23", BigDecimal.class).get(1)});
        ODDS.put("24", new BigDecimal[]{jsonObject.getList("24", BigDecimal.class).get(0), jsonObject.getList("24", BigDecimal.class).get(1)});
        ODDS.put("25", new BigDecimal[]{jsonObject.getList("25", BigDecimal.class).get(0), jsonObject.getList("25", BigDecimal.class).get(1)});
        ODDS.put("26", new BigDecimal[]{jsonObject.getList("26", BigDecimal.class).get(0), jsonObject.getList("26", BigDecimal.class).get(1)});
        ODDS.put("27", new BigDecimal[]{jsonObject.getList("27", BigDecimal.class).get(0), jsonObject.getList("27", BigDecimal.class).get(1)});
        ODDS.put("28", new BigDecimal[]{jsonObject.getList("28", BigDecimal.class).get(0), jsonObject.getList("28", BigDecimal.class).get(1)});
        ODDS.put("29", new BigDecimal[]{jsonObject.getList("29", BigDecimal.class).get(0), jsonObject.getList("29", BigDecimal.class).get(1)});
        ODDS.put("30", new BigDecimal[]{jsonObject.getList("30", BigDecimal.class).get(0), jsonObject.getList("30", BigDecimal.class).get(1)});
        ODDS.put("31", new BigDecimal[]{jsonObject.getList("31", BigDecimal.class).get(0), jsonObject.getList("31", BigDecimal.class).get(1)});
        ODDS.put("32", new BigDecimal[]{jsonObject.getList("32", BigDecimal.class).get(0), jsonObject.getList("32", BigDecimal.class).get(1)});
        ODDS.put("33", new BigDecimal[]{jsonObject.getList("33", BigDecimal.class).get(0), jsonObject.getList("33", BigDecimal.class).get(1)});
        ODDS.put("34", new BigDecimal[]{jsonObject.getList("34", BigDecimal.class).get(0), jsonObject.getList("34", BigDecimal.class).get(1)});
        ODDS.put("35", new BigDecimal[]{jsonObject.getList("35", BigDecimal.class).get(0), jsonObject.getList("35", BigDecimal.class).get(1)});
        ODDS.put("36", new BigDecimal[]{jsonObject.getList("36", BigDecimal.class).get(0), jsonObject.getList("36", BigDecimal.class).get(1)});
        ODDS.put("37", new BigDecimal[]{jsonObject.getList("37", BigDecimal.class).get(0), jsonObject.getList("37", BigDecimal.class).get(1)});
        ODDS.put("38", new BigDecimal[]{jsonObject.getList("38", BigDecimal.class).get(0), jsonObject.getList("38", BigDecimal.class).get(1)});
        ODDS.put("39", new BigDecimal[]{jsonObject.getList("39", BigDecimal.class).get(0), jsonObject.getList("49", BigDecimal.class).get(1)});
        ODDS.put("40", new BigDecimal[]{jsonObject.getList("40", BigDecimal.class).get(0), jsonObject.getList("40", BigDecimal.class).get(1)});
        ODDS.put("41", new BigDecimal[]{jsonObject.getList("41", BigDecimal.class).get(0), jsonObject.getList("41", BigDecimal.class).get(1)});
        ODDS.put("42", new BigDecimal[]{jsonObject.getList("42", BigDecimal.class).get(0), jsonObject.getList("42", BigDecimal.class).get(1)});
        ODDS.put("43", new BigDecimal[]{jsonObject.getList("43", BigDecimal.class).get(0), jsonObject.getList("43", BigDecimal.class).get(1)});
        ODDS.put("44", new BigDecimal[]{jsonObject.getList("44", BigDecimal.class).get(0), jsonObject.getList("44", BigDecimal.class).get(1)});
        ODDS.put("45", new BigDecimal[]{jsonObject.getList("45", BigDecimal.class).get(0), jsonObject.getList("45", BigDecimal.class).get(1)});
        ODDS.put("46", new BigDecimal[]{jsonObject.getList("46", BigDecimal.class).get(0), jsonObject.getList("46", BigDecimal.class).get(1)});
        ODDS.put("47", new BigDecimal[]{jsonObject.getList("47", BigDecimal.class).get(0), jsonObject.getList("47", BigDecimal.class).get(1)});
        ODDS.put("48", new BigDecimal[]{jsonObject.getList("48", BigDecimal.class).get(0), jsonObject.getList("48", BigDecimal.class).get(1)});
        ODDS.put("49", new BigDecimal[]{jsonObject.getList("49", BigDecimal.class).get(0), jsonObject.getList("49", BigDecimal.class).get(1)});

        ODDS.put("50", new BigDecimal[]{jsonObject.getList("49", BigDecimal.class).get(1), jsonObject.getList("49", BigDecimal.class).get(0)});
        ODDS.put("51", new BigDecimal[]{jsonObject.getList("48", BigDecimal.class).get(1), jsonObject.getList("48", BigDecimal.class).get(0)});
        ODDS.put("52", new BigDecimal[]{jsonObject.getList("47", BigDecimal.class).get(1), jsonObject.getList("47", BigDecimal.class).get(0)});
        ODDS.put("53", new BigDecimal[]{jsonObject.getList("46", BigDecimal.class).get(1), jsonObject.getList("46", BigDecimal.class).get(0)});
        ODDS.put("54", new BigDecimal[]{jsonObject.getList("45", BigDecimal.class).get(1), jsonObject.getList("45", BigDecimal.class).get(0)});
        ODDS.put("55", new BigDecimal[]{jsonObject.getList("44", BigDecimal.class).get(1), jsonObject.getList("44", BigDecimal.class).get(0)});
        ODDS.put("56", new BigDecimal[]{jsonObject.getList("43", BigDecimal.class).get(1), jsonObject.getList("43", BigDecimal.class).get(0)});
        ODDS.put("57", new BigDecimal[]{jsonObject.getList("42", BigDecimal.class).get(1), jsonObject.getList("42", BigDecimal.class).get(0)});
        ODDS.put("58", new BigDecimal[]{jsonObject.getList("41", BigDecimal.class).get(1), jsonObject.getList("41", BigDecimal.class).get(0)});
        ODDS.put("59", new BigDecimal[]{jsonObject.getList("40", BigDecimal.class).get(1), jsonObject.getList("40", BigDecimal.class).get(0)});
        ODDS.put("60", new BigDecimal[]{jsonObject.getList("39", BigDecimal.class).get(1), jsonObject.getList("39", BigDecimal.class).get(0)});
        ODDS.put("61", new BigDecimal[]{jsonObject.getList("38", BigDecimal.class).get(1), jsonObject.getList("38", BigDecimal.class).get(0)});
        ODDS.put("62", new BigDecimal[]{jsonObject.getList("37", BigDecimal.class).get(1), jsonObject.getList("37", BigDecimal.class).get(0)});
        ODDS.put("63", new BigDecimal[]{jsonObject.getList("36", BigDecimal.class).get(1), jsonObject.getList("36", BigDecimal.class).get(0)});
        ODDS.put("64", new BigDecimal[]{jsonObject.getList("35", BigDecimal.class).get(1), jsonObject.getList("35", BigDecimal.class).get(0)});
        ODDS.put("65", new BigDecimal[]{jsonObject.getList("34", BigDecimal.class).get(1), jsonObject.getList("34", BigDecimal.class).get(0)});
        ODDS.put("66", new BigDecimal[]{jsonObject.getList("33", BigDecimal.class).get(1), jsonObject.getList("33", BigDecimal.class).get(0)});
        ODDS.put("67", new BigDecimal[]{jsonObject.getList("32", BigDecimal.class).get(1), jsonObject.getList("32", BigDecimal.class).get(0)});
        ODDS.put("68", new BigDecimal[]{jsonObject.getList("31", BigDecimal.class).get(1), jsonObject.getList("31", BigDecimal.class).get(0)});
        ODDS.put("69", new BigDecimal[]{jsonObject.getList("30", BigDecimal.class).get(1), jsonObject.getList("30", BigDecimal.class).get(0)});
        ODDS.put("70", new BigDecimal[]{jsonObject.getList("29", BigDecimal.class).get(1), jsonObject.getList("29", BigDecimal.class).get(0)});
        ODDS.put("71", new BigDecimal[]{jsonObject.getList("28", BigDecimal.class).get(1), jsonObject.getList("28", BigDecimal.class).get(0)});
        ODDS.put("72", new BigDecimal[]{jsonObject.getList("27", BigDecimal.class).get(1), jsonObject.getList("27", BigDecimal.class).get(0)});
        ODDS.put("73", new BigDecimal[]{jsonObject.getList("26", BigDecimal.class).get(1), jsonObject.getList("26", BigDecimal.class).get(0)});
        ODDS.put("74", new BigDecimal[]{jsonObject.getList("25", BigDecimal.class).get(1), jsonObject.getList("25", BigDecimal.class).get(0)});
        ODDS.put("75", new BigDecimal[]{jsonObject.getList("24", BigDecimal.class).get(1), jsonObject.getList("24", BigDecimal.class).get(0)});
        ODDS.put("76", new BigDecimal[]{jsonObject.getList("23", BigDecimal.class).get(1), jsonObject.getList("23", BigDecimal.class).get(0)});
        ODDS.put("77", new BigDecimal[]{jsonObject.getList("22", BigDecimal.class).get(1), jsonObject.getList("22", BigDecimal.class).get(0)});
        ODDS.put("78", new BigDecimal[]{jsonObject.getList("21", BigDecimal.class).get(1), jsonObject.getList("21", BigDecimal.class).get(0)});
        ODDS.put("79", new BigDecimal[]{jsonObject.getList("20", BigDecimal.class).get(1), jsonObject.getList("20", BigDecimal.class).get(0)});
        ODDS.put("80", new BigDecimal[]{jsonObject.getList("19", BigDecimal.class).get(1), jsonObject.getList("19", BigDecimal.class).get(0)});
        ODDS.put("81", new BigDecimal[]{jsonObject.getList("18", BigDecimal.class).get(1), jsonObject.getList("18", BigDecimal.class).get(0)});
        ODDS.put("82", new BigDecimal[]{jsonObject.getList("17", BigDecimal.class).get(1), jsonObject.getList("17", BigDecimal.class).get(0)});
        ODDS.put("83", new BigDecimal[]{jsonObject.getList("16", BigDecimal.class).get(1), jsonObject.getList("16", BigDecimal.class).get(0)});
        ODDS.put("84", new BigDecimal[]{jsonObject.getList("15", BigDecimal.class).get(1), jsonObject.getList("15", BigDecimal.class).get(0)});
        ODDS.put("85", new BigDecimal[]{jsonObject.getList("14", BigDecimal.class).get(1), jsonObject.getList("14", BigDecimal.class).get(0)});
        ODDS.put("86", new BigDecimal[]{jsonObject.getList("13", BigDecimal.class).get(1), jsonObject.getList("13", BigDecimal.class).get(0)});
        ODDS.put("87", new BigDecimal[]{jsonObject.getList("12", BigDecimal.class).get(1), jsonObject.getList("12", BigDecimal.class).get(0)});
        ODDS.put("88", new BigDecimal[]{jsonObject.getList("11", BigDecimal.class).get(1), jsonObject.getList("11", BigDecimal.class).get(0)});
        ODDS.put("89", new BigDecimal[]{jsonObject.getList("10", BigDecimal.class).get(1), jsonObject.getList("10", BigDecimal.class).get(0)});
        ODDS.put("90", new BigDecimal[]{jsonObject.getList("9", BigDecimal.class).get(1), jsonObject.getList("9", BigDecimal.class).get(0)});
        ODDS.put("91", new BigDecimal[]{jsonObject.getList("8", BigDecimal.class).get(1), jsonObject.getList("8", BigDecimal.class).get(0)});
        ODDS.put("92", new BigDecimal[]{jsonObject.getList("7", BigDecimal.class).get(1), jsonObject.getList("7", BigDecimal.class).get(0)});
        ODDS.put("93", new BigDecimal[]{jsonObject.getList("6", BigDecimal.class).get(1), jsonObject.getList("6", BigDecimal.class).get(0)});
        ODDS.put("94", new BigDecimal[]{jsonObject.getList("5", BigDecimal.class).get(1), jsonObject.getList("5", BigDecimal.class).get(0)});
        ODDS.put("95", new BigDecimal[]{jsonObject.getList("4", BigDecimal.class).get(1), jsonObject.getList("4", BigDecimal.class).get(0)});
        ODDS.put("96", new BigDecimal[]{jsonObject.getList("3", BigDecimal.class).get(1), jsonObject.getList("3", BigDecimal.class).get(0)});
        ODDS.put("97", new BigDecimal[]{jsonObject.getList("2", BigDecimal.class).get(1), jsonObject.getList("2", BigDecimal.class).get(0)});
        ODDS.put("98", new BigDecimal[]{jsonObject.getList("1", BigDecimal.class).get(1), jsonObject.getList("1", BigDecimal.class).get(0)});
        tryOutRate = jsonObject.getInteger("tryOutRate");
    }

    @PostConstruct
    private void initWinRate() {
        PnGame pnGame = gameService.getPnGame();
        winRate = pnGame.getWinRate();
    }

    public Map<String, Object> bet(JSONObject jsonObject, String userId) {
        int result = random.nextInt(100);
        String type = jsonObject.getString("type");
        String userBet = type.substring(1);
        BigDecimal[] bigDecimals = ODDS.get(userBet);
        BigDecimal win = BigDecimal.ZERO;
        BigDecimal multiple = BigDecimal.ZERO;
        int chance = random.nextInt(100);
        if (BettingService.USER_IS_TRY_OUT.get(userId)) {
            if (type.charAt(0) == '0') {
                if (chance < tryOutRate) {
                    BigDecimal bigDecimal = bigDecimals[0];
                    if (Integer.parseInt(userBet) > result) {
                        win = jsonObject.getBigDecimal("amount").multiply(bigDecimal);
                        multiple = bigDecimal;
                    }
                } else {
                    result = Integer.parseInt(userBet) + random.nextInt(100 - Integer.parseInt(userBet));
                }
            } else {
                if (chance < tryOutRate) {
                    BigDecimal bigDecimal = bigDecimals[1];
                    if (Integer.parseInt(userBet) < result) {
                        win = jsonObject.getBigDecimal("amount").multiply(bigDecimal);
                        multiple = bigDecimal;
                    }
                } else {
                    result = random.nextInt(Integer.parseInt(userBet));
                }
            }
        } else {
            if (type.charAt(0) == '0') {
                if ((chance < Integer.parseInt(userBet) * winRate)) { // 赢了
                    BigDecimal bigDecimal = bigDecimals[0];
                    if (Integer.parseInt(userBet) > result) {
                        win = jsonObject.getBigDecimal("amount").multiply(bigDecimal);
                        multiple = bigDecimal;
                    }
                } else { // 输了
                    result = Integer.parseInt(userBet) + random.nextInt(100 - Integer.parseInt(userBet));
                }
            } else {
                if (chance < (99 - Integer.parseInt(userBet)) * winRate) { // 赢了
                    BigDecimal bigDecimal = bigDecimals[1];
                    if (Integer.parseInt(userBet) < result) {
                        win = jsonObject.getBigDecimal("amount").multiply(bigDecimal);
                        multiple = bigDecimal;
                    }
                } else { // 输了
                    result = random.nextInt(Integer.parseInt(userBet));
                }
            }
        }
        Map<String, Object> map = new HashMap<>();
        map.put("win", win);
        map.put("multiple", multiple);
        map.put("result", result);
        return map;
    }

    /**
     * 刷新游戏赔率设置
     */
    public void flushConfig() {
        // 获取新的游戏配置
        initOdds();
        // 返回到1分钟游戏场
        for (Map.Entry<String, ChannelHandlerContext> item : USER_CTX_MAP.entrySet()) {
            item.getValue().channel().writeAndFlush(new TextWebSocketFrame(JSON.toJSONString(AjaxResult.success(ODDS, "1001"))));
        }
    }

    public void flushWinRate() {
        // 获取新的杀率
        initWinRate();
    }
}
